/****************************************************
 * 创建人：  tanglei  
 * 创建时间: 2022/11/8/19:48
 * 项目名称：junit_test
 * 文件名称: ZipUtil.java
 * 文件描述: @Description: 
 *
 * All rights Reserved, Designed By 投资交易团队
 * @Copyright:2016-2022
 *
 ********************************************************/
package com.springboot.util;

import cn.hutool.core.util.ZipUtil;

import java.io.*;
import java.util.zip.Adler32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * 包名称：  src.util
 * 类名称：ZipUtil
 * 类描述：压缩工具
 * 创建人：  tanglei
 * 创建时间：2022/11/8 19:48
 */
public class ZipFileUtils {

    public static void compressFiles(File[] files, String zipPath) throws IOException {

        // 定义文件输出流，表明是要压缩成zip文件的
        FileOutputStream f = new FileOutputStream(zipPath);

        // 给输出流增加校验功能
        CheckedOutputStream checkedOs = new CheckedOutputStream(f, new Adler32());

        // 定义zip格式的输出流，这里要明白一直在使用装饰器模式在给流添加功能
        // ZipOutputStream 也是从FilterOutputStream 继承下来的
        ZipOutputStream zipOut = new ZipOutputStream(checkedOs);

        // 增加缓冲功能，提高性能
        BufferedOutputStream buffOut = new BufferedOutputStream(zipOut);

        //对于压缩输出流我们可以设置个注释
        zipOut.setComment("zip test");

        // 下面就是从Files[] 数组中读入一批文件，然后写入zip包的过程
        for (File file : files) {

            // 建立读取文件的缓冲流，同样是装饰器模式使用BufferedReader
            // 包装了FileReader
            BufferedReader bfReadr = new BufferedReader(new FileReader(file));

            // 一个文件对象在zip流中用一个ZipEntry表示，使用putNextEntry添加到zip流中
            zipOut.putNextEntry(new ZipEntry(file.getName()));

            int c;
            while ((c = bfReadr.read()) != -1) {
                buffOut.write(c);
            }

            // 注意这里要关闭
            bfReadr.close();
            buffOut.flush();
        }
        buffOut.close();
    }

    public static void main(String[] args) throws IOException {
//        String dir = "D:/aa/";
//        String zipPath = "D:test.zip";
////        File file = new File(dir);
////        File[] files = file.listFiles();
////        ZipFileUtils.compressFiles(files, zipPath);
//
//        ZipUtil.zip(zipPath, "D:\\test");

        File zip = ZipUtil.zip("d:/aa");
        System.out.println("zip.getName() = " + zip.getName());
        System.out.println("zip = " + zip.getAbsolutePath());

    }
}

